package com.hrm.utils;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import com.alibaba.druid.pool.DruidDataSourceFactory;

/*
 * 该工具类是JDBC工具类
 */
@SuppressWarnings("all") // 使用注解抑制警告信息
public class JDBCTools {

	// 定义全局变量
	private static QueryRunner qr;
	private static Properties pr;
	private static DataSource ds;

	// 加载DriverManager驱动类并获取文件中的信息
	static {
		try {
			pr = new Properties();
			// 接收文件信息
			InputStream is = JDBCTools.class.getClassLoader().getResourceAsStream("jdbc.properties");
			// 读取文件信息
			pr.load(is);
			qr = new QueryRunner();
			// 实例化数据源
			ds = getDataSource();
		} catch (Exception e) {
			e.getStackTrace();
		}
	}

	// 获取数据源
	public static DataSource getDataSource() throws Exception {
		return DruidDataSourceFactory.createDataSource(pr);
	}

	// 获取数据库连接
	public static Connection getConnection() {
		Connection conn = null;
		try {
			conn = ds.getConnection();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}

	// 释放资源
	public static void closeAll(Connection con, Statement ps, ResultSet rs) {
		// 进行状态判断,只有不为空的才释放,防止异常
		try {
			if (con != null) {
				con.close();
			}
			if (ps != null) {
				ps.close();
			}
			if (rs != null) {
				rs.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// 数据更新通用方法(增删改)
	public static int dataUpdate(String sql, Object... parametes) {
		// 定义变量记录受影响行数
		int iret = 0;
		Connection con = null;
		try {
			// 获取数据库连接对象
			con = getConnection();
			iret = qr.update(con, sql, parametes);
			return iret;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 调用方法释放资源
			closeAll(con, null, null);
		}
		return iret;
	}

	// 数据查询通用方法(查)
	public static <T> List<T> dataQuery(Class<T> clazz, String sql, Object... parametes) {
		// 定义返回值对象
		T obj = null;
		// 定义
		List<T> list = null;
		Connection con = null;
		try {
			// 获取数据库连接对象
			con = getConnection();
			// 通过反射创建对应的对象
			obj = clazz.newInstance();
			list = new ArrayList<>();
			list = (List<T>) qr.query(con, sql, new BeanListHandler<>(obj.getClass()), parametes);
		} catch (Exception e) {
			e.getStackTrace();
		} finally {
			// 调用方法释放资源
			closeAll(con, null, null);
			return list;
		}
	}

	// 数据查询通用方法(查)
	public static Integer dataCount(String sql, Object... parametes) {
		Integer count = 0;
		Connection con = null;
		try {
			// 获取数据库连接对象
			con = getConnection();
			Object obj = qr.query(con, sql, new ScalarHandler(), parametes);
			count = Integer.parseInt(obj.toString());
		} catch (Exception e) {
			e.getStackTrace();
		} finally {
			// 调用方法释放资源
			closeAll(con, null, null);
		}
		return count;
	}

}